// Author: wsfuyibing <682805@qq.com>
// Date: 2025-04-25

package kind

import "time"

type QrcodeSetting struct {
    Timeout QrcodeTimeout
    Limit   QrcodeLimit
}

// QrcodeType
// 二维码类型.
type QrcodeType uint16

const (
    _ QrcodeType = iota

    QrcodeTypeUser // 用户二维码
)

var (
    // 小程序路径.
    // 用户扫码后, 跳转到此页面处理后续逻辑.
    qrcodeTypePaths = map[QrcodeType]string{
        QrcodeTypeUser: "/qrcode/user",
    }
    // 类型配置.
    qrcodeTypeSettings = map[QrcodeType]QrcodeSetting{}
    // 默认配置.
    qrcodeTypeSettingDefault = QrcodeSetting{
        Timeout: 300, // 300过期
        Limit:   1,   // 限扫1次(任意一个成功扫码后, 就不能再使用了)
    }
)

func (o QrcodeType) BuildPath() string {
    if str, ok := qrcodeTypePaths[o]; ok {
        return str
    }
    return ""
}

func (o QrcodeType) Setting() QrcodeSetting {
    if setting, ok := qrcodeTypeSettings[o]; ok {
        return setting
    }
    return qrcodeTypeSettingDefault
}

// QrcodeLimit
// 扫码限次.
type QrcodeLimit int

const QrcodeLimitDisabled QrcodeLimit = 0

func (o QrcodeLimit) IsDisabled() bool { return o == QrcodeLimitDisabled }
func (o QrcodeLimit) IsEnabled() bool  { return !o.IsDisabled() }

func (o QrcodeLimit) IsReached(n int) bool {
    return n >= o.Int()
}

func (o QrcodeLimit) Int() int { return int(o) }

// QrcodeTimeout
// 超时配置.
type QrcodeTimeout int

const QrcodeTimeoutDisabled QrcodeTimeout = 0

func (o QrcodeTimeout) IsDisabled() bool { return o == QrcodeTimeoutDisabled }
func (o QrcodeTimeout) IsEnabled() bool  { return !o.IsDisabled() }

// IsExpiredFor
// 是否已过期.
//
// 入参 tm 为二维码创建时间, 使用当前时间减去创建时间差值(毫秒)与配置时长比较.
func (o QrcodeTimeout) IsExpiredFor(tm time.Time) bool {
    return time.Now().Sub(tm).Milliseconds() >= o.Int64()
}

func (o QrcodeTimeout) Int() int     { return int(o) }
func (o QrcodeTimeout) Int64() int64 { return int64(o * 1000) }
